package com.br.negocio.web.backbean;

import java.io.Serializable;

import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.hibernate.exception.ConstraintViolationException;
import org.springframework.context.annotation.Scope;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Controller;

import com.br.negocio.controller.ControllerColaborador;
import com.br.negocio.vo.ColaboradorVO;
import com.br.negocio.web.formbean.ColaboradorFormBean;

@Controller("colaboradorBackBean")
@Scope("session")
public class ColaboradorBackBean implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Resource
	private ControllerColaborador controllerColaborador;
	
	private ColaboradorFormBean colaboradorFormBean;

	public ColaboradorBackBean() {
		super();
		this.colaboradorFormBean = new ColaboradorFormBean();
	}

	public ColaboradorFormBean getColaboradorFormBean() {
		return this.colaboradorFormBean;
	}

	public void setColaboradorFormBean(ColaboradorFormBean colaboradorFormBean) {
		this.colaboradorFormBean = colaboradorFormBean;
	}
	
	// M�TODOS

	public void obterListaColaborador() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			this.colaboradorFormBean.setListaColaborador(this.controllerColaborador.obterListaColaborador());
		} catch (Exception e) {
			context.addMessage(null, new FacesMessage("Erro ao obter a lista de colaboradors: " + e.getMessage()));
		}
	}
	
	public void manterColaborador() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			if (this.colaboradorFormBean.getColaboradorManter().getCodigo() == 0) {
				this.controllerColaborador.inserirColaborador(this.colaboradorFormBean.getColaboradorManter());
			} else {
				this.controllerColaborador.atualizarColaborador(this.colaboradorFormBean.getColaboradorManter());
			}
			this.colaboradorFormBean.setListaColaborador(this.controllerColaborador.obterListaColaborador());
		} catch (Exception e) {
			context.addMessage(null , new FacesMessage("Erro ao manter o colaborador: " + e.getMessage()));
		}
		
	}
	
	public void excluirColaborador() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			if (this.getColaboradorFormBean().getColaboradorManter().getCodigo() != 0) {
				this.controllerColaborador.removerColaborador(this.colaboradorFormBean.getColaboradorManter());
				this.colaboradorFormBean.setListaColaborador(this.controllerColaborador.obterListaColaborador());
				this.colaboradorFormBean.setColaboradorManter(new ColaboradorVO());
			}
		} catch (DataIntegrityViolationException e) {
			if (e.getCause().getClass() == ConstraintViolationException.class) {
				context.addMessage(null, new FacesMessage("Erro ao excluir o colaborador: O colaborador est� associado a alguma outra entidade."));
			} else {
				context.addMessage(null, new FacesMessage("Erro ao excluir o colaborador: " + e.getMessage()));
			}
		} catch (Exception e) {
			context.addMessage(null, new FacesMessage("Erro ao excluir o colaborador: " + e.getMessage()));
		}
	}
	
	// LISTENERS
	
	public void listenerIrInserirColaborador(ActionEvent evento) {
		this.colaboradorFormBean.setColaboradorManter(new ColaboradorVO());
		this.colaboradorFormBean.setIsDisabled(false);
		this.colaboradorFormBean.setIsEditarDisabled(false);
		this.colaboradorFormBean.setHead("Cadastrar Colaborador");
	}
	
	public void listenerIrExcluirColaborador(ActionEvent evento) {
		UIParameter comp = (UIParameter) evento.getComponent().findComponent("colaboradorExcluir");
		ColaboradorVO colaboradorVO = ((ColaboradorVO)comp.getValue());
		
		if (colaboradorVO != null) {
			this.colaboradorFormBean.setColaboradorManter(this.controllerColaborador.obterColaborador(colaboradorVO));
		}
		this.colaboradorFormBean.setHead("Excluir Colaborador");
		this.colaboradorFormBean.setIsDisabled(true);
		this.colaboradorFormBean.setIsEditarDisabled(true);
	}
	
	public void listenerIrEditarColaborador(ActionEvent evento) {
		UIParameter comp = (UIParameter) evento.getComponent().findComponent("colaboradorEditar");
		ColaboradorVO colaboradorVO = ((ColaboradorVO)comp.getValue());
		
		if (colaboradorVO != null) {
			this.colaboradorFormBean.setColaboradorManter(this.controllerColaborador.obterColaborador(colaboradorVO));
		}
		this.colaboradorFormBean.setHead("Editar Colaborador");
		this.colaboradorFormBean.setIsDisabled(false);
		this.colaboradorFormBean.setIsEditarDisabled(true);
	}

}